package unit6;

public class DoubleLinkedList4 {

    private StudentNode2 head = new StudentNode2(0, null);

    public StudentNode2 getHead() {
        return head;
    }


    public void list() {
        StudentNode2 temp = head.next;
        if (temp == null) {
            System.out.println("链表为空");
            return;
        }
        // 当节点的地址域不为空时，一直遍历打印节点数据，temp为空时跳出循环
        while (temp != null) {
            System.out.println(temp);
            // 指针后移，继续遍历
            temp = temp.next;
        }

    }


    public void add(StudentNode2 studentNode) {
        // 因为head不能动，所以需要一个temp辅助变量作为指针
        StudentNode2 temp = head;
        // 遍历链表，找到最后
        while (true) {
            // 找到链表最后
            if (temp.next == null) {
                break;
            }
            // 没有找到链表最后，temp指针后移
            temp = temp.next;
        }
        // 当退出while循环时，temp指向了链表的最后
        // 让最后的这个节点的next指向新的节点
        temp.next = studentNode;
        // 让新节点的pre指向最后一个节点temp，形成了双向链表
        studentNode.pre = temp;

    }



    public void addByOrder(StudentNode2 studentNode) {
        // 因为head不能动，所以需要一个temp辅助变量作为指针
        // 我们找的temp是位于添加位置的前一个节点，否则插入不了
        StudentNode2 temp = head;
        // 表示添加的节点的编号是否已经存在，默认false表示不存在
        boolean flag = false;
        while (true) {
            // 如果遍历到末尾就跳出循环
            if (temp.next == null) {
                break;
            }
            // 如果添加的节点的编号小于temp的下一个节点的编号，那说明添加的节点编号大小在temp和temp.next两个节点编号之间
            // 找到了要添加的位置了，跳出循环
            if (temp.next.no > studentNode.no) {
                break;
            }
            // 表示单链表中已经存在
            if (temp.next.no == studentNode.no) {
                flag = true;
                break;
            }
            temp = temp.next;
        }
        // 判断flag
        if (flag) {// flag=true
            System.out.println("已经存在该学生信息，不能重复添加");
        } else {// flag=false
            // 新节点的后继指针指向原来temp节点的后继节点
            studentNode.next = temp.next;
            // 让原来temp的后继指针指向新的节点
            temp.next = studentNode;
            // temp的原来下一个节点的前驱指针指向新节点
            temp.next.pre = studentNode;
            // 新节点的前驱指向temp节点
            studentNode.pre = temp;
        }
    }


    public static int getLength(StudentNode2 head) {
        // 如果是空链表
        if(head.next == null) {
            return 0;
        }
        int length = 0;
        StudentNode2 curr = head.next;
        while( curr != null) {
            length++;
            curr = curr.next;
        }
        return length;
    }



    public StudentNode2 findByNo(StudentNode2 head,int no) {
        if(head == null) {
            System.out.println("空链表，无法查询");
            return null;
        }
        StudentNode2 temp = head;
        boolean flag = false;
        int len = DoubleLinkedList.getLength(head);
        for (int i = 0; i <= len; i++) {
            if(temp == null) {
                break;
            }
            if(temp.no == no) {
                flag = true;
                break;
            }
            temp = temp.next;
        }
        if(flag) {
            return temp;
        }
        return null;
    }


}

